-
Notifications
You must be signed in to change notification settings - Fork 2
/
DuLinkList.cpp
63 lines (47 loc) · 1.46 KB
/
DuLinkList.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include "DuLinkList.h"
// 算法2.13 双向链表的插入
// 在带头结点的双向链表L中第i个位置之前插入元素e, i的合法值为1<=i<=表长+1
Status ListInsert_DuL(DuLinkList &L, int i, ElemType e) {
DuLNode *p;
// 在L中确定第i个元素的位置指针p, p为NULL时,第i个元素不存在
if (!(p = GetElemP_DuL(L, i)))
return ERROR;
// 生成新节点*s
DuLNode *s = new DuLNode;
s->data = e;
// 将节点*s插入L中
s->prior = p->prior;
p->prior->next = s;
s->next = p;
p->prior = s;
return OK;
}
// 算法2.14 双向链表的删除
// 删除带头节点的双向链表L中的第i个元素
Status ListDelete_DuL(DuLinkList &L, int i) {
DuLNode *p;
// 在L中确定第i个元素的位置指针p, p为NULL时,第i个元素不存在
if (!(p = GetElemP_DuL(L, i)))
return ERROR;
// 修改指针
p->prior->next = p->next;
p->next->prior = p->prior;
// 释放被删除结点的空间
delete p;
return OK;
}
// 在带头结点的双向链表L中查找第i个元素, 返回结点的地址
DuLNode *GetElemP_DuL(DuLinkList L, int i) {
// 初始化, p指向第一个结点, j为计数器
int j = 1;
DuLinkList p = L->next;
// 顺链域向后扫描, 直到p指向第i个元素或p为空
while (j < i && p) {
p = p->next;
++j;
}
// 第i个元素不存在
if (!p || j > i)
return nullptr;
return p;
}